call by Value by Reference

by Value

말 그대로 같은 ‘Value, 값’만 복사하고 각기 다른 메모리공간에 저장

따라서 a 나 b 의 값을 바꾼다고 해도 서로의 값에 영향을 주지 않는다

by Reference

메모리 상 해당 객체의 주소, reference를 복사하기 때문에 각기 다른 변수에 할당하더라도 모두 메모리상 같은 공간을 가르킨다.(해당 주소의 같은 메모리공간) 따라서 해당 객체를 변경하면 그에 연결된 모든 변수들이 영향을 받음

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
//by Value (primitives)
var a = 3;
var b;

b = a;
a = 2;

console.log(a); // 2
console.log(b); // 3

//by Reference (Objects including functions)
var c = { greeting: 'hi};
var d;

// 객체이니 새로운 메모리 공간 할당x
//c 가 가르키는 메모리상 같은 공간을 d도 가르키도록 함
d = c;

c.greeting = 'hello'; // mutate

// 같은 주소상 같은 객체를 변경했기 때문에 둘다 영향 받음
console.log(c); // Object { greeting: 'hello'}
console.log(d); // Object { greeting: 'hello'}

//by Reference (even as parameters)
function changeGreeting(obj) {
obj.greeting = 'Hola!';
}

changeGreeting(d);
console.log(c); // Object { greeting: 'Hola!'}

주의 할 점

1
2
3
4
5
// = 연산자를 사용하면 새로운 메모리공간을 할당한다
c = {greeting: 'howdy'};

console.log(c); // Object { greeting: 'howdy'}
console.log(d); Object { greeting: 'Hola!'}

Functions

Share